메트릭 서버
개요
Metrics Server는 kubelet에서 수집할 수 있는 cpu와 메모리 두 가지 컴퓨팅 자원에 대한 메트릭을 수집할 수 있도록 도와주는 툴이다.
이 놈이 있어야 HPA를 할 수 있다.
또한 kubectl로 top 명령어도 사용할 수 있게 된다.
대체로 메트릭을 측정하는 프로세스들은 많은 리소스를 차지하기도 하나, 이 놈은 목표가 딱 명확해서 최대한 효율적으로 짜여졌다.
구조
사용자 입장에서 흐름도를 보겠다.
- 사용자가 top 명령어 등으로 메트릭 조회를 시전!
- kube-apiserver가 요청을 받고 metric api 호출!
- 이를 받는 metric server가 노드의 kubelet의 노출된 포트로 정보를 수집!
- kubelet은 메트릭을 수집할 수 있는 컨테이너 런타임으로 동작해야 가능할 것이다.
즉, 메트릭 자체는 kubelet이 통계나 정보를 내주는 것이고, 이를 사용자가 볼 수 있도록 메트릭 서버를 사용하는 것이다.
요구사항
- kube-apiserver에 API Aggregation Layer가 활성화돼야 한다.
- 노드에서는 웹훅 인가(apiserver 인자
--authorization-mode
에 Node)가 돼야 한다. - kubelet의 인증서가 클러스터 CA에 의해 서명돼있어야 한다.
- 아니면
--kubelet-insecure-tls
인자를 메트릭 서버에 써넣어야 한다.
- 아니면
- 컨테이너 런타임이 메트릭 관련 RPC를 구현하거나, cAdvisor[1]의 지원을 받아야 한다.
- 나중에 추가 정리를 할 수도 있지만, cAdvisor는 kubelet에 내부 바이너리로 들어가 있다.
- 네트워크 요구사항
- 컨트롤 플레인에서 메트릭 서버로 통신이 가능해야 한다.
- 메트릭 서버에서 모든 노드의 kubelet으로 통신이 가능해야 한다.
여기 사항들은 기본적인 클러스터 구성을 했다면 이미 다 충족이 돼있다.
다만 kubelet 관련 조건이 충족이 안 돼있기 때문에, 해당 부분만 수정해주면 된다.
헬름 설치
버전 관리의 용이성을 위하여 헬름으로 설치를 진행한다.[2]
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm show values metrics-server/metrics-server > metric-server.yaml
그냥 진행하면 위에서 말한 조건에 문제가 생겨서 조금의 커스터마이징이 필요하다.
args
부분에만 위에 말한 옵션을 넣어주면, metrics server 프로세스가 실행될 때 해당 옵션을 받아서 실행된다.
helm -n kube-system install -f metric-server.yaml metric-server metrics-server/metrics-server
이렇게 되면 성공이다.
그러나 당연히 tls를 무시하고 연결하는 식으로 설정하는 것은 그다지 보안에 있어서 좋은 방향은 아니다.
가장 좋은 방법은, 클러스터를 부트스트랩할 때부터 kubelet이 TLS를 이용하는 것이다.
serverTLSBootstrap
이라는 필드를 두고 kubelet이 설치되면 해당 문제가 해결되긴 한다.[3]
이건 처음 클러스터 구축할 때 뿐만 아니라 이후에 kubelet을 재시작하는 식으로도 가능하니, 기왕이면 이런 식으로 세팅하자.